There are several noteworthy incompatibilities between GNU C and most existing (non-ANSI) versions of C. The -traditional option eliminates many of these incompatibilities, but not all , by telling GNU C to behave like the other C compilers.
One consequence is that you cannot call mktemp with a string constant argument. The function mktemp always alters the string its argument points to.
Another consequence is that sscanf does not work on some systems when passed a string constant as its format control string or input. This is because sscanf incorrectly tries to write into the string constant. Likewise fscanf and scanf .
The best solution to these problems is to change the program to use char -array variables with initialization strings for these purposes instead of string constants. But if this is not possible, you can use the -fwritable-strings flag, which directs GNU CC to handle string constants the same way most C compilers do. -traditional also has this effect, among others.
This is because 2147483648 cannot fit in the type int , so (following the ANSI C rules) its data type is unsigned long int . Negating this value yields 2147483648 again.
#define foo(a) "a"
will produce output "a" regardless of what the argument A is.
jmp_buf j;
foo () {
int a, b;
a = fun1 ();
if (setjmp (j))
return a;
a = fun2 ();
/*
longjmp (j)
may occur in
fun3
. */
return a + fun3 ();
}
Here a may or may not be restored to its first value when the longjmp occurs. If a is allocated in a register, then its first value is restored; otherwise, it keeps the last value stored in it.
If you use the - W option with the -O option, you will get a warning when GNU CC thinks such a problem might be possible.
The -traditional option directs GNU C to put variables in the stack by default, rather than in registers, in functions that call setjmp . This results in the behavior found in traditional C compilers.
foobar ( #define luser hack)
ANSI C does not permit such a construct, and neither does GNU CC--even with -traditional .
In some other C compilers, a extern declaration affects all the rest of the file even if it happens within a block.
The -traditional option directs GNU C to treat all extern declarations as global, like traditional compilers.
typedef int foo;
typedef long foo bar;
In ANSI C, this is not allowed: long and other type modifiers require an explicit int . Because this criterion is expressed by Bison grammar rules rather than C code, the -traditional flag cannot alter it.
#if 0
You can't expect this to work.
#endif
The best solution to such a problem is to put the text into an actual C comment delimited by /*...*/ . However, -traditional suppresses these error messages.
The solution is to change your program to use time_t as the return type of time .
The method used by GNU CC is as follows: a structure or union which is 1, 2, 4 or 8 bytes long is returned like a scalar. A structure or union with any other size is stored into an address supplied by the caller (usually in a special, fixed register, but on some machines it is passed on the stack). The machine-description macros STRUCT_VALUE and STRUCT_INCOMING_VALUE tell GNU CC where to pass this address.
By contrast, PCC on most target machines returns structures and unions of any size by copying the data into an area of static storage, and then returning the address of that storage as if it were a pointer value. The caller must copy the data from that memory area to the place where the value is wanted. GNU CC does not use this method because it is slower and nonreentrant.
You can tell GNU CC to use a compatible convention for all structure and union returning with the option -fpcc-struct-return .
A "preprocessing token" is a "preprocessing number" if it begins with a digit and is followed by letters, underscores, digits, periods and e+ , e- , E+ , or E- character sequences.
To make the above program fragment valid, place whitespace in front of the minus sign. This whitespace will end the preprocessing number.